package com.mrx.commons.model.converter;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.mrx.commons.model.dto.PageResult;

import java.util.Collection;
import java.util.List;

/**
 * 基础的 mapstruct 转换接口
 *
 * @author Mr.X
 * @since 2023-12-19 14:11
 **/
public interface BaseConverter<PO, DTO, VO> {

    DTO po2DTO(PO po);

    VO po2VO(PO po);

    PO dto2PO(DTO dto);

    PO vo2PO(VO vo);

    VO dto2VO(DTO dto);

    DTO vo2DTO(VO vo);

    List<DTO> po2DTO(Collection<PO> po);

    List<VO> po2VO(Collection<PO> po);

    List<PO> dto2PO(Collection<DTO> dto);

    List<PO> vo2PO(Collection<VO> vo);

    List<VO> dto2VO(Collection<DTO> dto);

    List<DTO> vo2DTO(Collection<VO> vo);

    default PageResult<DTO> po2PageDTO(IPage<PO> page) {
        IPage<DTO> converted = page.convert(this::po2DTO);
        long currentPage = converted.getCurrent();
        long pageSize = converted.getSize();
        long totalPages = converted.getPages();
        long totalCount = converted.getTotal();
        return PageResult.of(currentPage, pageSize, totalPages, totalCount, converted.getRecords());
    }

}
